package com.leyou.item.service.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.leyou.common.dto.PageDTO;
import com.leyou.common.exception.LyException;
import com.leyou.item.dto.BrandDTO;
import com.leyou.item.entity.Brand;
import com.leyou.item.entity.CategoryBrand;
import com.leyou.item.mapper.BrandMapper;
import com.leyou.item.service.BrandService;
import com.leyou.item.service.CategoryBrandService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class BrandServiceImpl extends ServiceImpl<BrandMapper, Brand> implements BrandService {
    @Autowired
    CategoryBrandService categoryBrandService;

    /**
     * 分页查询品牌
     * @param page 当前页
     * @param rows 每页大小
     * @param key 搜索关键字
     * @return 分页结果
     */
    @Override
    public PageDTO<BrandDTO> queryBrandByPage(Integer page, Integer rows, String key) {
        //1.分页信息的健壮性处理
        page = Math.min(page, 100);
        rows = Math.max(rows, 5);
        //2.分页
        Page<Brand> info = new Page<>(page, rows);
        //3.判断key是否存在
        boolean isKeyExists = StringUtils.isNoneBlank(key);
        //4.逻辑 ，如果存在，添加like 和 eq 的查询条件，否则不添加
        query().like(isKeyExists, "name", key).or()
                .eq(isKeyExists, "letter", key)
                .page(info);

        //5.封装结果
        List<Brand> list = info.getRecords();
        return new PageDTO<>(info.getTotal(),info.getPages(),BrandDTO.convertEntityList(list));
    }
    /*
    * 根据分类 ID 查询品牌集合
    * 两步走，查中间表 ，再查品牌表
    * */
    @Override
    public List<BrandDTO> queryBrandByCategoryId(Long cid) {
        //1.根据分类id , 查询中间表 ， 得到中间表对象集合
        List<CategoryBrand> categoryBrandList = categoryBrandService.query().eq("category_id",cid).list();
        if (CollectionUtils.isEmpty(categoryBrandList)) {
            return Collections.emptyList();
        }
        //2.获取品牌id集合 stream.map.collect
        List<Long> ids = categoryBrandList
                .stream()
                .map(CategoryBrand::getBrandId)
                .collect(Collectors.toList());
        //3.根据品牌ID集合，查询品牌集合
        if (CollectionUtils.isEmpty(ids)) {
            throw new LyException("当前分类对应的品牌不存在", 204);
        }
        List<Brand> brandList = listByIds(ids);
        //4.po 转换 DTO 一个使用DTO构造，集合使用工具类，并返回
        return BrandDTO.convertEntityList(brandList);
    }
    /*
    *  新增品牌
    * */
    @Transactional
    @Override
    public void saveBrand(BrandDTO brandDTO) {
        //1.DTO 转换 po ,并保存po
        Brand brand = brandDTO.toEntity(Brand.class);
        save(brand);
        //2. jdk8 流式取法 封装中间表对象的集合
        List<CategoryBrand> list = brandDTO.getCategoryIds()
                .stream()
                .map(id -> CategoryBrand.zl(id,brand.getId()))
                .collect(Collectors.toList());
        //3.批量写入中间表数据
        categoryBrandService.saveBatch(list);
    }
    /*
    * 更新品牌
    * */
    @Transactional
    @Override
    public void updateBrand(BrandDTO brandDTO) {
        //1. DTO - PO , 更新品牌表
        Brand brand = brandDTO.toEntity(Brand.class);
        updateById(brand);
        //2.根据品牌id删除原中间表数据
        Map columnMap = new HashMap();
        columnMap.put("brand_id", brand.getId());
        categoryBrandService.removeByMap(columnMap);
        //3.封装中间表对象的集合
        List<CategoryBrand> categoryBrandList = brandDTO.getCategoryIds().stream()
                .map(id -> CategoryBrand.zl(id,brand.getId()))
                .collect(Collectors.toList());
        //4.批量修改中间表数据
        categoryBrandService.saveOrUpdateBatch(categoryBrandList);
    }

    /*
    * 删除品牌
    * */
    @Transactional //增删改都要有事务
    @Override
    public void deleteBrandById(Long id) {
        //1.根据品牌id删除原中间表数据
        Map columnMap = new HashMap();
        columnMap.put("brand_id", id);  //提示，没有规定泛型。
        categoryBrandService.removeByMap(columnMap);
        //2.根据id删除 品牌
        removeById(id);
    }


}
